高温水熱条件下における地球化学的反応輸送シミュレーション(第1回):概要とシステム設計

水と岩石の化学反応を追いかける「反応輸送モデル」。Python、MODFLOW、PHREEQCを連携させたシミュレーションシステムの全体設計を、図解を交えて初心者にも分かりやすく解説します。
Groundwater
Python
MODFLOW
Geochemistry
Simulation
地下水
地球化学
作者

DeepFlow

公開

2026年4月30日

ノート概要 (Abstract)

本稿では、Python を用いた地球化学的反応輸送シミュレーション(Reactive Transport Simulation)フレームワークの設計思想と全体構成を解説します。

200 °Cの高温条件下における「岩石カラム貫流実験」をターゲットとし、以下の3つを統合的に実行するシステムを構築します: 1. 流体流れ場の計算(MODFLOW 6) 2. 地球化学反応の計算(PHREEQC / Thermoddem データベース) 3. データの可視化と実験値の比較

Pythonのオブジェクト指向設計により、複雑なパラメータ管理や化学反応の定義をすっきりと整理しました。


1. はじめに:反応輸送モデル(RTM)とは?

水–岩石相互作用(water–rock interaction)は、地熱発電、放射性廃棄物の深地層処分、CO₂の地中貯留(CCS)など、地球科学における最重要テーマの一つです。

これらをコンピュータ上で再現し、定量的に予測するために使われるのが 反応輸送モデル(Reactive Transport Model: RTM) です。RTM は、以下の2つの現象を同時に計算します。

  1. 移流・分散(Advection-Dispersion): 水が地下をどのように流れていくか。
  2. 化学反応(Chemical Reactions): 流れる水と岩石の間で、どんな鉱物が溶け(溶解)、どんな新しい鉱物が生まれるか(沈殿)。
ヒント💡 わかりやすいイメージ

川が流れる様子をシミュレーションするアプリ(MODFLOW)と、試験管の中で試薬を混ぜて反応を見るアプリ(PHREEQC)が、1ステップごとに「ここまで水が動いたよ」「そこでこんな反応が起きたよ」とキャッチボールしながら進んでいくイメージです。

本シリーズでは、高温(200 °C)・高圧条件下で行われる「岩石カラム貫流実験」をモデル化し、流出水の化学組成(ケイ素、カルシウム、ナトリウムなど)が時間とともにどう変化するかを予測するシステムを構築します。


2. シミュレーション対象の物理系

2.1 カラム実験の概要

実験装置(カラム)のモデル化を図解します。円柱状の岩石サンプルを15分割(15セル)し、左端から200℃の水を注入して、右端から出てくる成分を調べます。

graph LR
    In("💧 注入水<br>(200℃, 1.0 mL/min)") --> C1[セル 1]
    C1 --> C2[セル 2]
    C2 -.->|移流・分散<br>& 化学反応| C14[...]
    C14 --> C15[セル 15]
    C15 --> Out("🧪 流出水<br>(水質変化を観測)")
    
    style In fill:#a2d2ff,stroke:#023e8a,stroke-width:2px,color:#000
    style Out fill:#ffc8dd,stroke:#c9184a,stroke-width:2px,color:#000
    style C1 fill:#f5f5f5,stroke:#999
    style C2 fill:#f5f5f5,stroke:#999
    style C14 fill:#f5f5f5,stroke:#999
    style C15 fill:#f5f5f5,stroke:#999

【基本パラメータ】

パラメータ 意味
カラム長 \(L\) 0.15 m 岩石サンプルの全体の長さ
カラム半径 \(r\) 0.01 m サンプルの太さ(半径)
セル数 \(N\) 15 シミュレーション上の分割数(\(\Delta x = 0.01\) m)
流量 \(Q\) 1.0 mL/min 注水するペース
間隙率 \(\phi\) 0.35 岩石の隙間の割合(35%が隙間)
透水係数 \(K\) \(1\times 10^{-4}\) m/s 水の通りやすさ
温度・圧力 200 °C / 98.7 atm 高温高圧の過酷な環境
実験時間 144 時間 6日間にわたる連続反応

2.2 対象鉱物(一次鉱物と二次鉱物)

水と触れることで、岩石の成分が溶け出したり、逆に新しい鉱物が結晶化したりします。

ノート一次鉱物と二次鉱物
  • 一次鉱物(Primary minerals): 最初から岩石に含まれている鉱物。熱水と触れることで徐々に溶解し、水中にイオン(成分)を放出します。
  • 二次鉱物(Secondary minerals): 水中に溶け出した成分が飽和状態になり、新しく沈殿(結晶化)して生まれる鉱物。
分類 鉱物名 役割
一次(溶ける) Albite(low) (曹長石) Na・Si・Al を放出
Anorthite (灰長石) Ca・Al を放出
Enstatite(α) (頑火輝石) Mg・Si を放出
Ferrosilite(α) (鉄珪輝石) Fe・Si を放出
Diopside (透輝石) Ca・Mg・Si を放出
Microcline (微斜長石) K・Al を放出
Amorphous silica (非晶質シリカ) Si のバッファー(緩衝)役
二次(生まれる) Calcite (方解石) Ca と炭素をトラップして結晶化
Boehmite (ベーム石) Al をトラップして結晶化
Beidellite(Na) (バイデライト) Na・Al スメクタイト(粘土鉱物)

3. フレームワークのアーキテクチャ

複雑なパラメータや計算ロジックが絡み合うため、本フレームワークでは オブジェクト指向 を採用し、役割ごとに 4つのクラス に分割しました。

graph TD
    Config["⚙️ GeochemicalTransportConfig<br>(パラメータ一元管理)"] --> Sim
    Chem["🧪 ChemistryFactory<br>(化学反応定義の生成)"] --> Sim
    Sim["💻 GeochemicalSimulator<br>(流れ場・輸送計算の実行)"] --> Vis["📊 Visualizer<br>(結果の可視化・CSV出力)"]
    
    style Sim fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,color:#000
    style Config fill:#fff3e0,stroke:#f57c00,stroke-width:1px,color:#000
    style Chem fill:#e8f5e9,stroke:#388e3c,stroke-width:1px,color:#000
    style Vis fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px,color:#000

  1. GeochemicalTransportConfig: 温度や計算時間などの設定を一つにまとめます。温度を変えて何度も実験(バッチ実行)する際に非常に便利です。
  2. ChemistryFactory: PHREEQCに渡す「化学反応の数式(速度論的反応速度式)」を作ります。
  3. GeochemicalSimulator: システムの心臓部です。水の動きを計算する run_flow と、化学反応と移動を連成させる run_transport を実行します。
  4. Visualizer: 計算された膨大なデータを、美しいグラフやCSVファイルとして出力します。

4. 使用ソフトウェアと熱力学データベース

本システムは以下の強力なオープンソースツールを組み合わせて構築されています。

ツール・DB 役割
Python 3.x システム全体を制御するメインプログラム
FloPy PythonからMODFLOW 6を操作するライブラリ
MODFLOW 6 水がどこをどの速さで流れるかを計算するエンジン
phreeqpy PythonからPHREEQCを操作するライブラリ
PHREEQC 化学反応(溶解・沈殿・平衡など)を計算するエンジン
Thermoddem v1 高温(最大300℃)に対応した熱力学データベース
ヒントデータベースの重要性

水と岩石の反応シミュレーションでは「どの温度で、どのくらい物質が溶けやすいか」というデータ(平衡定数など)が必須です。通常のデータベースは常温(25℃付近)を前提としていますが、今回は200℃の高温を扱うため、フランスBRGMが開発した Thermoddem v1 という特殊なデータベースを採用しています。


5. 計算フローの全体像

実際のプログラムが動くときのデータの流れ(フロー)は以下の5ステップです。

sequenceDiagram
    participant Flow as 🌊 MODFLOW<br>(流れ場)
    participant Transport as 🔄 Python<br>(メイン制御)
    participant Chem as 🧪 PHREEQC<br>(化学計算)
    participant Out as 📊 出力<br>(可視化・CSV)

    Note over Transport: Step 1: 流れ場計算
    Transport->>Flow: 水理パラメータ送信
    Flow-->>Transport: ダルシー流速 (v) を返却
    
    Note over Transport: Step 2: 反応輸送計算ループ
    loop タイムステップごと・セルごと
        Transport->>Chem: 水の移動&現在の化学状態を送信
        Chem-->>Transport: 反応後の新しい水質・鉱物量を返却
    end
    
    Note over Out: Step 3〜5: 結果出力
    Transport->>Out: 時系列データのプロット (水化学)
    Transport->>Out: 鉱物変化量のプロット
    Transport->>Out: CSVファイル保存

第2回では、このシステムの前半部分である 「Step 1: 流れ場計算」「PHREEQCのセットアップ(Step 2の準備)」 の具体的なコード実装について解説します。


6. まとめ

本稿では、200℃の高温カラム実験をターゲットにした「地球化学的反応輸送シミュレーション」のシステム概要と設計思想を解説しました。

複雑になりがちな化学・物理計算のコードをオブジェクト指向で整理することで、温度や鉱物を変えたシミュレーションにも柔軟に対応できる拡張性の高い設計になっています。

次回(第2回)は、いよいよ具体的なPythonコードを使って、MODFLOWによる流速計算とPHREEQCへの化学条件設定を行っていきます!お楽しみに。